{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p align=\"center\">\n",
    "    <img src=\"https://github.com/GeostatsGuy/GeostatsPy/blob/master/TCG_color_logo.png?raw=true\" width=\"220\" height=\"240\" />\n",
    "\n",
    "</p>\n",
    "\n",
    "## Machine Learning Introduction  \n",
    "\n",
    "### Predictive Machine Learning Modeling in Python with scikit-learn \n",
    "\n",
    "#### Michael Pyrcz, Associate Professor, University of Texas at Austin \n",
    "\n",
    "##### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1) | [GeostatsPy](https://github.com/GeostatsGuy/GeostatsPy)\n",
    "\n",
    "#### Machine Learning-based Prediction\n",
    "\n",
    "Here's a simple workflow, demonstration of training and tuning a machine learning model with a simple dataset.  \n",
    "\n",
    "* I provide this as the most basic, minimum Python workflow to assist those learning predictive machine learning\n",
    "\n",
    "* I demonstration model training and tuning (by-hand and automatically), including the pipeline approach\n",
    "\n",
    "* Given the 1 predictor feature and 1 response for ease of data and model visualization\n",
    "\n",
    "This provides an opportunity to run and visualize a variety of machine learning models for experiential learning.\n",
    "\n",
    "#### Machine Learning-based Prediction\n",
    "\n",
    "We build predictive machine learning models with supervised learning: \n",
    "\n",
    "**Prediction**\n",
    "\n",
    "* non-parametric method for regression (continuous response) and classification (categorical response)\n",
    "\n",
    "* a function $\\hat{f}$ of the nearest $k$ training data in predictor feature space such that we predict a response feature $Y$ from a set of predictor features $X_1,\\ldots,X_m$. \n",
    "\n",
    "* the prediction is of the form: \n",
    "\n",
    "\\begin{equation}\n",
    "\\hat{Y} = \\hat{f}(X_1,\\ldots,X_m) + \\epsilon\n",
    "\\end{equation}\n",
    "\n",
    "where $\\epsilon$ is an error term.\n",
    "\n",
    "**Suppervised Learning**\n",
    "\n",
    "* the response feature, $Y$, is available over the training and testing data\n",
    "\n",
    "#### The Machine Learning Models\n",
    "\n",
    "This workflow includes the following model:\n",
    "\n",
    "* decision tree regression\n",
    "\n",
    "For more information about decision trees check out this [decision tree lecture](https://github.com/GeostatsGuy/PythonNumericalDemos/blob/master/SubsurfaceDataAnalytics_DecisionTree.ipynb) and the associated demonstration [decision tree workflow](https://github.com/GeostatsGuy/PythonNumericalDemos/blob/master/SubsurfaceDataAnalytics_DecisionTree.ipynb). \n",
    "\n",
    "#### Getting Started\n",
    "\n",
    "Here's the steps to get setup to run this demonstration:\n",
    "\n",
    "1. **Install Anaconda 3** on your machine from https://www.anaconda.com/download/. \n",
    "2. **Open Jupyter Notebook**, look for the Jupyter app on your system after installing Anaconda 3.\n",
    "3. **Load this Workflow** found here [PythonDataBasics_PredictiveMachineLearning.ipynb](https://github.com/GeostatsGuy/PythonNumericalDemos/blob/master/PythonDataBasics_PedictiveMachineLearning.ipynb). \n",
    "4. **Load the data**, this workflow retreives the data from my GitHub [GeoDataSets Repository](https://github.com/GeostatsGuy/GeoDataSets). If you want to work locally, you will need to first download the data file to your working directory. The data file is found here, [1D_Porosity.csv](https://github.com/GeostatsGuy/GeoDataSets/blob/master/1D_Porosity.csv). Code is provided below to set the working directory and to load the data locally.\n",
    "\n",
    "#### Import Required Packages\n",
    "\n",
    "We will also need some standard packages. These should have been installed with Anaconda 3."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os                                                   # to set current working directory \n",
    "import pandas as pd                                         # DataFrames and plotting\n",
    "import numpy as np                                          # arrays and matrix math\n",
    "import matplotlib.pyplot as plt                             # plotting"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you get a package import error, you may have to first install some of these packages. This can usually be accomplished by opening up a command window on Windows and then typing 'python -m pip install [package-name]'. More assistance is available with the respective package docs.  \n",
    "\n",
    "#### Set the Random Number Seed\n",
    "\n",
    "These workflows and models may use random processes, e.g.:\n",
    "\n",
    "* random train and test split with cross validation and k-fold cross validation\n",
    "* random selection of a subset of features to consider for the next split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = 73073                                                # random number seed\n",
    "np.random.seed(seed)                                        # scikit-learn uses the NumPy seed"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Declare functions\n",
    "\n",
    "Let's define a couple of functions to streamline plotting correlation matrices and visualization of a decision tree regression model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "#none needed"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Set the working directory\n",
    "\n",
    "I always like to do this so I don't lose files and to simplify subsequent read and writes (avoid including the full address each time).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "# not needed currently\n",
    "#os.chdir(\"c:/PGE383\")                                       # set the working directory"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You will have to update the part in quotes with your own working directory and the format is different on a Mac (e.g. \"~/PGE\").  \n",
    "\n",
    "#### Read the data table\n",
    "\n",
    "We use a data \"1D_Porosity.csv\" comma delimited file from my GitHub [GeoDataSets Respository](https://github.com/GeostatsGuy/GeoDataSets).  \n",
    "\n",
    "* this code loads the data directly from my GitHub repository.\n",
    "* if you have the data file available locally (i.e. you are not connected to the internet) set the working directory to the location with the data file and use the second line below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loaded 40 samples, with features = ['Depth' 'Nporosity'].\n"
     ]
    }
   ],
   "source": [
    "my_data = pd.read_csv(\"https://raw.githubusercontent.com/GeostatsGuy/GeoDataSets/master/1D_Porosity.csv\") # load the comma delimited data file\n",
    "#my_data = pd.read_csv(\"1D_Porosity.csv\")                   # load the comma delimited data file locally\n",
    "X = pd.DataFrame(data = my_data.loc[:,'Depth'])             # ensure X and y features are DataFrames\n",
    "y = pd.DataFrame(data = my_data.loc[:,'Nporosity'])\n",
    "X.head(n=2); y.head(n=2)                                    # preview the predictor feature\n",
    "print('Loaded ' + str(len(my_data)) + ' samples, with features = ' + str(my_data.columns.values) + '.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Plot the Available Data\n",
    "\n",
    "Let's do a simple scatter plot to check the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X,y,color='red',s=30,edgecolor='black',alpha=0.2); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.title('All Data'); plt.xlim([0,10.25]); plt.ylim([-2.5,2.5])\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Fast Forward Through Data Analytics\n",
    "\n",
    "This workflow is focussed on building predictive machine learning models\n",
    "\n",
    "* for brevity we skip data checking, data analytics, statistical analysis, feature transformations etc. \n",
    "\n",
    "* we skip all the way to model building\n",
    "\n",
    "* we don't even discuss model selection, feature selection, nor robust hyperparameter tuning\n",
    "\n",
    "This is the most simple predictive machine learning workflow possible!\n",
    "\n",
    "* basics for machine learning with scikit-learn in Python. Nothing more."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Let's Build a Predictive Machine Learning Model\n",
    "\n",
    "We use the following steps to build our model\n",
    "\n",
    "1. **instantiate** the machine learning model with hyperparameters\n",
    "2. **fit**, train the machine learing model to the training data\n",
    "3. **predict**, check the trained machine learning models to predict at withheld testing data\n",
    "4. **select** the optimum hyperparameters, hyperparameter tuning\n",
    "5. **refit** the model by training with all data given the tuned hyperparmaeters \n",
    "\n",
    "We will use the train - test approach, an alternative is the train, validate and test approach. \n",
    "\n",
    "* we will start simple and cover k-fold cross validation and scikit-learn pipeline class later"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Optional: Add Random Error to the Response Feature, $y$\n",
    "\n",
    "For more experiential learning consider repeating this workflow with different amounts of additional error\n",
    "\n",
    "* to observe issues of model overfit consider adding some additional error, \n",
    "\n",
    "```python \n",
    "error_stdev = 0.0                                           # standard deviation of additional random error\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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GzYA8Oabb3LWWWdRXl7OpZdeyqpVqzqNcenSpZxzzjkATJw4sVWCetdddzFlyhQmT57MqlWrqK1tf2G6RLcTERERyRYFlehurq9n6I4djBo+nEFFRYwaPpyhO3awub6+x8d09w4fGzBgQLf3aWv//fcHoFevXuzduxeA733ve5xwwgnU1NTwwAMPsGvXri6PE8zm1tr69euZN28ejz/+OCtXruSjH/1ou8dKdDsRERGRbFJQie7OxkYG9e/fqm1Q//7s7GImhM7MnDmTe++9l7feeosdO3awaNEiZsyY0ek+H/zgB1sS1Fgsxp/+9KdunfPNN9/k4IMPBmDBggUJxXjbbbcBUFNTw8qVKwFoampiwIABHHjggbz++us8/PDDLfsMHDiQ7du3d7mdiIiISLYqqBrd/oMH01Rfz6Ciopa2pp076T9mTI+POWXKFObOncvRRx8NwAUXXMDkyZNbygzaM3XqVD7+8Y9TUVHB6NGjqays5MADD0z4nN/85jeZM2cOV111FbNnz+5y+4suuojzzjuPiRMnMmnSpJZYKyoqmDx5MkceeSSHHXYY06dPb9nnwgsv5OSTT6akpIQnnniiw+1EREREspV15zJ61CorK73t/K+rV6/miCOOSGj/5hrdoTt2MKh/f5p27mTbgAGMO+aYpAak9UQsFqOoqIi33nqLmTNnctNNN7UaJCbv6s57LCIiIoXFzKrdvbK9xwqqR7dv376MO+YYNtfX83pjI/3HjGFckrMu9NSFF15IbW0tu3btYs6cOUpyRURERFKsoBJdCJLdUaNHw+jRkcZx++23R3p+ERERkXxXUIPRRERERKRw5EWim0t1xtI9em9FRESkp3K+dKFfv340NDRQXFzc7lyxkrvcnYaGBvr16xd1KAUnFotRs6KGrZs2M6x0BOUV5RTFzVYiIiKSC3I+0R01ahQbN25ky5YtUYciadCvXz9GjRoVdRgFJRaLsWjBQore6MXQQcXU161l7Yt1nDb3TCW7IiKSU3I+0e3Tpw9jx46NOgyRvFGzooaiN3oxbux4AEYUj6RufS01K2o4dvp7l7QWERHJVnlRoysiqbN102aGDipu1TZ0UDFbN22OKCIREZGeUaIrIq0MKx3BtqaGVm3bmhoYVjoioohERER6RomuiLRSXlFObMg+6tbXsrnhderW1xIbso/yivKoQxMR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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "error_stdev = 0.0                                           # standard deviation of additional random error\n",
    "y_orig = y.copy(deep = True)                                # make a deep copy of original dataset\n",
    "y['Nporosity'] = y['Nporosity'] + np.random.normal(loc = 0, scale = error_stdev, size = y.shape[0])\n",
    "plt.scatter(X,y,color='blue',s=30,edgecolor='black',alpha=0.2,label='with added noise'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.title('All Data, Original and with Added Noise'); plt.xlim([0,10.25]); plt.ylim([-2.5,2.5])\n",
    "plt.scatter(X,y_orig,color='red',s=30,edgecolor='black',alpha=0.2,label='original data'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.legend(loc='upper left')\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Split Train and Test\n",
    "\n",
    "We will demonstrate the following hyperparameter tuning methods:\n",
    "\n",
    "* **cross validation** - split 25% of data as withheld testing data, only 25% of data are tested\n",
    "* **k-fold cross validation** - calculate average error over k folds, all data are tested\n",
    "\n",
    "Let's start with cross validation and then demonstrate k-fold cross validation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split        # random train and test data split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.25, random_state=seed) # train and test split\n",
    "plt.scatter(X_train,y_train,color='green',s=30,edgecolor='black',alpha=0.4,label='train'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.title('Train and Test Data'); plt.xlim([0,10.25]); plt.ylim([-2.5,2.5]); \n",
    "plt.scatter(X_test,y_test,color='gray',s=30,edgecolor='black',alpha=0.2,label='test'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right')\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Build a Decision Tree Model\n",
    "\n",
    "Let's instantiate (set the hyperparameter(s)) and fit (train with training data) a decision tree regression model to our data. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import tree                                    # tree program from scikit learn (package for machine learning)\n",
    "max_leaf_nodes = 6                                          # set the hyperparameter\n",
    "our_tree = tree.DecisionTreeRegressor(max_leaf_nodes = max_leaf_nodes) # instantiate the model\n",
    "our_tree = our_tree.fit(X_train, y_train)                   # fit the model to the trainin data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Predict With a Decision Tree Model\n",
    "\n",
    "Now let's make a prediction with our trained decision tree model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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K52pThqSDTQtaSIej0cdloSU6IqIiIhMQCaTYc2Na+id3ktidoINmzaw7rF1rFqxSslumVCiKyIiIjIBre2t9E7vZd6ieQDUJmvp7Oiktb2Vk5adNOHrvvzyy2zZsoXdu3cXKtSqMG3aNObOncvUqVNzPkeJroiIiMgEdKY6ScxODNoWnx2na1tXXtfdsmULiUSC+fPnY2Z5XatauDvPP/88W7ZsYcGCBTmfp8FoIiIiIhPQkGwgvT09aFtme4b6I+rzuu7u3buZNWuWktwsZsasWbPG3cutRFdERERkApqWNFG7q5bNHZvpTfXS2dHJzF0zaVrSlPe1leQeaCKviRJdERERkQmIx+OsWrGK0xeeTsOeBk5beFpVDETbsWMH3/3ud8d93jve8Q527NhRhIgmTjW6IiIiIhMUj8fzGnhWjgYS3U996lODtvf39xOLxUY878477yx2aOOmRFdERERE9rv44ot5+umnaWxsZOrUqcTjcebMmUNbWxsbNmzg7LPPpquri927d3PhhReycuVK4JUVbDOZDGeccQYnnngiDz74IEcddRR33HEH06dPL/lzUaIrIiIiUsEKvWjFZZddRkdHB21tbdx33328853vpKOjY/9sB9dddx21tbXs2rWLpUuXcs455zBr1qxB13jqqae45ZZb+P73v8/73/9+brvtNlasWJHX85wIJboiIiIiFaoUi1a86U1vGjSl15VXXsntt98OQFdXF0899dQBie6CBQtobGwE4Pjjj+fZZ58tSCzjpcFoIiIiIhUqe9GK2mQt8xbN44XpL9Da3lqwNg455JD9P993333cc889PPTQQ7S3t9PU1DTslF+vetWr9v8ci8XYu3dvweIZDyW6IiIiIhWqGItWJBIJ0un0sPt27tzJzJkzOfjgg3niiSf4/e9/P+F2SiGy0gUzqwd+CCSBfcDV7n5FVPGIiIiIVJqGZAMbNm2gNlm7f1tme4b6hRNftGLWrFksW7aMRYsWMX36dI444oj9+04//XRWr17N4sWLOeaYY3jzm9+cV/zFZu4eTcNmc4A57v6omSWA9cDZ7r5hpHOam5u9paWlZDGKiIiIlNrGjRs57rjjcjp2aI1uZnuGmbtmVsV8vsMZ7rUxs/Xu3jzc8ZH16Lp7N9Ad/pw2s43AUcCIia6IiIiIvGJg0YrW9la6tnVRv7A+71kXqklZzLpgZvOBJuDhaCMRERERqSzVuGhFoUQ+GM3M4sBtwOfc/S/D7F9pZi1m1tLT01P6AEVERESkIkWa6JrZVIIk9yZ3/+lwx7j71e7e7O7NdXV1pQ1QRERERCpWZImumRlwLbDR3S+PKg4RERERqU5R9uguAz4MnGJmbeHXOyKMR0RERESqSGSJrrs/4O7m7ovdvTH8ujOqeEREREQEduzYwXe/+90Jnfutb32Ll156qcARTVzkg9FEREREpHxUU6JbFtOLiYiIiEh5uPjii3n66adpbGzkbW97G4cffjg//vGP2bNnD+95z3v42te+xosvvsj73/9+tmzZQn9/P5deeinbtm1j69atLF++nNmzZ3PvvfdG/VSU6IqIiIhUsr6+PlKpFOl0mkQiQTKZpKamZsLXu+yyy+jo6KCtrY277rqLW2+9lXXr1uHunHXWWdx///309PRw5JFH8stf/hKAnTt3cuihh3L55Zdz7733Mnv27EI9vbyodEFERESkQvX19dHW1kZPTw9Tpkyhp6eHtrY2+vr6CnL9u+66i7vuuoumpibe+MY38sQTT/DUU0/xhje8gXvuuYcvfvGL/Pa3v+XQQw8tSHuFph5dERERkQqVSqWIxWLMmTMHgEQiQXd3N6lUioaGhryv7+586UtfYtWqVQfsW79+PXfeeSdf+tKXePvb386Xv/zlvNsrNPXoioiIiFSodDpNPB4ftC0ej5NOpyd8zUQisf/80047jeuuu45MJgPAn//8Z5577jm2bt3KwQcfzIoVK7jooot49NFHDzi3HKhHV0RERKRCJRIJenp6SCQS+7dlMhnyWU121qxZLFu2jEWLFnHGGWfwoQ99iBNOOAEIkugbb7yRTZs28YUvfIGDDjqIqVOn8r3vfQ+AlStXcsYZZzBnzpyyGIxm7h51DDlrbm72lpaWqMMQERERKZqNGzdy3HHH5XTsQI1uLBYjHo+TyWTo7++nsbExrwFp5Wq418bM1rt783DHq0dXREREpELV1NTQ2Ni4f9aFurq6vGddqCZKdEVEREQqWE1NTUEGnlUjDUYTERERkaqkRFdEREREqpJKF0TkAJlMhtb2VjpTnTQkG2ha0nTA9DUiIiLlTomuiAySyWRYc+Maeqf3kpidYMOmDax7bB2rVqxSsisiIhVFpQsiMkhreyu903uZt2getcla5i2a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RURkdCpzE6lOVV+6ICIiMhaVuYlUp0nRoysiIjIalbmJVCcluiIiIqjMTaQaqXRBRERERKqSenSLTBOQi4iIiERDiW4RaQJyERERkeiodKGINAG5iIiISHSU6BaRJiAXERERiY4S3SJqSDaQ3p4etC2zPUP9EZqAXERERKTYlOgWkSYgFxEREYmOBqMVkSYgFxEREYmOEt0i0wTkIiIiItFQ6YKIiIiIVCUluiIiIiJSlZToioiIiEhVUqIrIiIiIlVJia6IiIiIVKVIEl0z+4aZPWFmfzCz283ssCjiEBEREZHqFVWP7t3AIndfDPwR+FJEcYiIiIhIlYok0XX3u9x9b/jw98DcKOIQERERkepVDjW6HwP+K+ogRERERKS6FG1lNDO7B0gOs+sSd78jPOYSYC9w0yjXWQmsBGhoaChCpGPLZDK0trfSmeqkIdmgZXxFREREKoC5ezQNm50HfBI41d1fyuWc5uZmb2lpKW5gQ2QyGdbcuIbe6b0kZidIb09Tu6uWVStWKdkVERERiZiZrXf35uH2RTXrwunAF4Gzck1yo9La3krv9F7mLZpHbbKWeYvm8cL0F2htb406NBEREREZRVQ1ut8BEsDdZtZmZqsjimNMnalOErMTg7bFZ8fp2tYVUUQiIiIikoui1eiOxt0XRtHuRDQkG9iwaQO1ydr92zLbM9QvrI8wKhEREREZSznMulDWmpY0Uburls0dm+lN9dLZ0cnMXTNpWtIUdWgiIiIiMopIenQrSTweZ9WKVbS2t9K1rYv6hfWadUFERESkAijRzUE8HuekZSdFHYaIiIiIjINKF0RERESkKinRFREREZGqpERXRERERKqSEl0RERERqUpKdEVERESkKinRFREREZGqpERXRERERKqSEl0RERERqUpKdEVERESkKinRFREREZGqpERXRERERKqSEl0RERERqUrm7lHHkDMzSwNPRh2HlNxsYHvUQUgk9N5PTnrfJy+995NTvu/7PHevG27HlDwuGoUn3b056iCktMysRe/75KT3fnLS+z556b2fnIr5vqt0QURERESqkhJdEREREalKlZboXh11ABIJve+Tl977yUnv++Sl935yKtr7XlGD0UREREREclVpPboiIiIiIjmpiETXzE43syfNbJOZXRx1PFIaZlZvZvea2UYze9zMLow6JikdM4uZWauZ/SLqWKR0zOwwM7vVzJ4I/+2fEHVMUnxm9vnw73yHmd1iZtOijkmKw8yuM7PnzKwja1utmd1tZk+F32cWqr2yT3TNLAZcBZwBvA74oJm9LtqopET2An/v7scBbwY+rfd+UrkQ2Bh1EFJyVwBr3f1YYAn6Hah6ZnYU8LdAs7svAmLAX0cblRTR9cDpQ7ZdDPza3Y8Gfh0+LoiyT3SBNwGb3P0Zd+8DfgS8O+KYpATcvdvdHw1/ThP8h3dUtFFJKZjZXOCdwDVRxyKlY2YzgJOBawHcvc/dd0QblZTIFGC6mU0BDga2RhyPFIm73w/0Dtn8buCG8OcbgLML1V4lJLpHAV1Zj7egZGfSMbP5QBPwcLSRSIl8C/gHYF/UgUhJvRroAX4Qlq1cY2aHRB2UFJe7/xn4V6AT6AZ2uvtd0UYlJXaEu3dD0MkFHF6oC1dComvDbNNUEZOImcWB24DPuftfoo5HisvMzgSec/f1UcciJTcFeCPwPXdvAl6kgLcwpTyF9ZjvBhYARwKHmNmKaKOSalEJie4WoD7r8Vx0S2PSMLOpBEnuTe7+06jjkZJYBpxlZs8SlCqdYmY3RhuSlMgWYIu7D9y5uZUg8ZXq9lbgT+7e4+4vAz8F/mfEMUlpbTOzOQDh9+cKdeFKSHQfAY42swVmVkNQoP6ziGOSEjAzI6jV2+jul0cdj5SGu3/J3ee6+3yCf++/cXf17kwC7p4CuszsmHDTqcCGCEOS0ugE3mxmB4d/909FgxAnm58B54U/nwfcUagLTynUhYrF3fea2WeAXxGMxLzO3R+POCwpjWXAh4HHzKwt3PaP7n5nhDGJSHF9Frgp7Nh4BvhoxPFIkbn7w2Z2K/AowWw7rWiFtKplZrcAbwFmm9kW4CvAZcCPzezjBB983lew9rQymoiIiIhUo0ooXRARERERGTcluiIiIiJSlZToioiIiEhVUqIrIiIiIlVJia6IiIiIVCUluiIiRWBm/WbWZmaPm1m7mf2dmU34b66Z/WPWz/PNrCPH8z5nZh8ZRzs1Zna/mZX99JMiImNRoisiUhy73L3R3V8PvA14B8F8kRP1j2MfMliYrH4MuDnXc9y9D/g18IHxticiUm6U6IqIFJm7PwesBD5jgZiZfcPMHjGzP5jZKgAze0vYm3q7mW0ws9VmdpCZXQZMD3uIbwovGzOz74c9xneZ2fRhmj4FeNTd94bXv8/M/i1sY6OZLTWzn5rZU2b2z1nn/SfwN8V7RURESkOJrohICbj7MwR/cw8HPg7sdPelwFLgf5nZgvDQNwF/D7wBeA3wXne/mFd6iAcS0KOBq8Ie4x3AOcM0uwxYP2Rbn7ufDKwmWGbz08Ai4HwzmxUe0xHGJSJS0ZToioiUjoXf3w58JFza+mFgFkHiCrDO3Z9x937gFuDEEa71J3cfWBp7PTB/mGPmAD1Dtv0s/P4Y8Li7d7v7HoLldusBwrb7zCwxnicnIlJuNNhARKQEzOzVQD/wHEHC+1l3/9WQY94CDF2XfaR12vdk/dwPDFe6sAuYNsJ5+4ZcYx+D/094FbB7hLZFRCqCenRFRIrMzOoISgW+4+4O/Aq4wMymhvtfa2aHhIe/ycwWhDM0fAB4INz+8sDx47ARWDiBeGcBPe7+8njPFREpJ+rRFREpjulhacJUYC/w78Dl4b5rCEoNHjUzIygvODvc9xBwGUGN7v3A7eH2q4E/mNmjwCU5xvBfYbvjtRy4cwLniYiUFQs6F0REJGph6cJF7n5mAa95O/AP7v7UOM75KfAld3+yUHGIiERBpQsiItXtYoJBaTkxsxrgP5Xkikg1UI+uiIiIiFQl9eiKiIiISFVSoisiIiIiVUmJroiIiIhUJSW6IiIiIlKVlOiKiIiISFVSoisiIiIiVen/A/DpCnY6N+PrAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "itest = 2; depth = X_test['Depth'].values[itest]            # set the predictor value for our prediction\n",
    "spor = our_tree.predict([[depth]])                          # predict with our trained model\n",
    "plt.scatter(X_train,y_train,color='green',s=30,edgecolor='black',alpha=0.4,label='train'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.title('Train and Test Data and Model Prediction'); plt.xlim([0,10.25]); plt.ylim([-2.5,2.5]) \n",
    "plt.scatter(X_test,y_test,color='gray',s=30,edgecolor='black',alpha=0.2,label='test'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right')\n",
    "plt.scatter(depth,spor,color='black',s=30,marker='s',edgecolor='black',alpha=0.6,label='predict'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right')\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Predict Over a Range of Predictor Feature Values with a Decision Tree Model\n",
    "\n",
    "Now, let's make predictions over a range of predictor feature values so we can visualize the model.\n",
    "\n",
    "* this is easy to do since we have just 1 predictor feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAroAAAEHCAYAAABBQeUvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzde3yU5Zn/8c+VEwmZCUlIZAIkAUQURUgKWBW19VCVFu1BbXdb2q5uK63trm21a62trba7r267dq1WC/XQrau1B13rof4sHvCsYDBBIiBEJQmQgUACZMiJJPfvj5nEhEnCQA5zyPf9euUF89zzPM81zwzhmvu57+s25xwiIiIiIokmKdoBiIiIiIiMBCW6IiIiIpKQlOiKiIiISEJSoisiIiIiCUmJroiIiIgkJCW6IiIiIpKQlOiKCABmlmxmATMrioFYXjazf4p2HInMzP7LzJbH6jnNrMzM/mGkYzrcuc3sSjN75CiP86KZXTK80YnIkVCiKxKnQklp90+XmbX0evyFIz2ec67TOedxztWMRLzDwczu7vUa283sYK/Hjw/huN80s6cO85wyM2s1syYz22dmb5jZd8wsNcJzeMzMmZnvaOMcLWa2JBTrfYdsPyO0/YloxRaK4796vfd7Qwnl/JE4l3Put865T0cYU58k3jl3lnPu4ZGIS0Qio0RXJE6FklKPc84D1AAX9dr2wKHPN7OU0Y9yeDnnvtLrNf8ceKDXa75oFEL4J+ecF5gC3AB8Bfi/UThvNGwHLjAzT69tXwI2RymeQ90T+hxMAt4C/tTfkxLhcy8iR0+JrkiCMrOfmtmfzOxBM2sClprZaWb2eqgXrM7MbuvukTSzlFBv3bTQ4/tD7f8v1Iv5mplNH+BcSWb2kJn5Q8d+3sxm92of9FhmdqGZvRPqKf0VYEN43R8xszWhONaa2Wm92r5mZtWhGN41s8+Y2ULgFuC8UA/htsOdwzkXcM6tBD5FMBn8aOj4Z4XOvc/MdpjZLWaWHNrtxdCf74bOs8TMJpnZU2a228wazOwRM5s0yGu7ycy2huJfb2aLe7V908xWmtkdofNXmdnZvdpnha57k5n9Dcg+zMsMAE8Dl4T2HwdczCEJpZmdbWbloXO+1rtn9XDnHOy9ipRzrg34X+BYM0sPXYenzWy5mTUC14bOdVXoM9ZgZk+Y2eRecVwcul57zewXh8TYp7ffzEpDn+/G0L+hb1lweMK/Av8cem9fDT239xCI5NC/ydrQv5O7LfQlwszmWPBuwVfMbLuZ7TKzb/c655lmVmFm+0Pn/OmRXieRsUqJrkhi+zTwB2ACwQSlA7gayAMWARcCywbZ//PAD4Fcgr3GPxnkuU8AxwE+oJJg8nHYY5nZMcBDwPdCcW0DPhzh6+vDzI4l2MP6vdB5bgIeNbMJZpYP/AdwdqhX9ixgg3PuDeAa4JlQz/DUSM/nnNsceq1nhja1A1eFzv0Rgtf/8lDbWaE/jw2d5wmCv4PvAKYCM4BUgkn3QDYCpxJMGH8J/MnMcnu1nw28Ejr/cuCu0HUxgtf4WWAicCsQyfCW+wj24gJ8MnTshu5GMysAHgN+GjruPcCTZuY93DkHe68iiKuHmWWEYtzknGvtdR3WEPw8/crMlgLfAD5BsAd4PfD70P5TgAcJ/rvIB/YBJQOcayLwDPDH0HFOAF4JDU+4jVAvs3Pu9H52/wbBz8Mi4HiCdwV6J9VpwFyCn4OLgf80s+JQ253ATc65rNC+j0V6fUTGOiW6IontZefc4865Ludci3PuDefcaudch3PuPeC3BBOygTzknCtzzh0EHmCABCB0/P9xzjWFko0fA/PNLDOCYy0BKpxzj4TabgHqj/L1/hPwZ+fcc6GYHgO2AOcBXQR7ik8ys3HOue3OuU1HeZ7edhBM1HDOvR56jZ3OuS3AvQxyfZ1zdaH3p9U5txf42WGe/0fnnD90/N8Bu4DSXk952zn3B+dcJ8Ek9dhQr+Fs4FjgZudcu3PuaYK9tYfzDDDLzAoJJpP3HdL+KeAN59zDoc/U3aGYLojgnP/EwO9VJC43s73AVmAmcFmvts3OuXtD16mF4Je5m51zVaHP2I+Bc0KJ6yeB15xzfwu1/YxgstufzxD8crQ89Jr2hb4oReILwH8652qcc/uAHwBLe7UbcKNzrs059zpQBZwcajtI8H3Idc7td86tifCcImOeEl2RxFbb+4GZnWBmfwvdOt0P3Eyw12sg/l5/bwY8/T0pdFv252b2Xui4VaGm3sce6FiTe8fpnOsi2Kt7NIqBfwrdgt4bSoRKgMnOuT3Al4FvAzvN7NFQr+JQTSHUyxm6Bf2Ume0MXYfvM8j1NbMsM/td6Hb2fuDJwzz/ytCQhe7XNo3BrzEEr/NkYJdzrr1Xe/XhXljovXgQ+A4wPxRfb5P7OU41wWtyuHMO+F4dLq6Q3znnsp1zk5xzFzjnKnu11R7y3GLg7l7n2Umw930q4Z+/DoJfXvpTCLwbYXyHOvRaVQOeXj3YbaEvO916/xv5IrAA2GLBoUcfO8oYRMYcJboiic0d8ngFwVvtM0O3QW9kCONhe/kS8HHgHILDJGaGtkdy7DqCCURwB7MkggnI0agFlocSoO6fTOfc7QDOucecc+cQTMR2AL8O7XfodYqImR0HnAS8FNp0D8Fb5jNC1/c/+OAa9HeOGwgO9Zgfev7HGeCamdmJBIcr/DOQ65zLJtibGek1PsbM0npti7SM3H0Eb+s/FOrx7G0HwSSytyKCE9kOd85B36shOvRa1wJLDzlXhnNuHeGfv2QGTrZrCfZSR3LOQx16rYqAQKh3d1DOubedc5cBxwC/Af7PNMlOJCJKdEXGFi/B27IHLDhZbLDxuUd63DZgDzAe+Pcj2PcJoMTMPhn6z/vbBMdKHo3/Af4xNEEqycwyzOw8C076KjSzj4fGdLYCB4DO0H47gaJIkwcLlgo7D3gEeNo593yoyQvsdc4dMLOTCVZlAMA5d4DgBK8ZvQ7lJdhztzc0hviGQU7rITj8oh5IMrNvEOzRjcQG4D3gB2aWambnAhH1CoZ6Ss8mOA73UI8CC83sUxaczHg5wcR9ZQTn/B8GeK8ifE1HYjlwo5nNAjCzHDP7TK/XcJqZLbbgxMzrCH5Z68//ASeGetbTQmO/F4TadgLTQ2OT+/Mg8F0zm2pmWQTHqIdVR+mPmX0pNGyhk+C/3y6O8suZyFijRFdkbLmG4O37JoK9u/2WZDoKvyPYY7UDeBt4NdIdnXM7gc8RnJizh2BP1+qjCSI0LvYygknZHoI9nv9CsNczhWAiuRPYTfA2+dWhXZ8k2AtZb2aD3dL/HwtWsNhBcCzn7wlOMOr2LeDrZhYAfkVw0lJvNwKPhG6hf4JgiTQfwaEPLxJM+gd6bWsI9hiXh84/BagYJNbe+zqC1+V8oJHgUIQ/RLJvaP8XQu/Todt3EByn+2OC1/trwCdC40gHPedh3qth5Zz7X4LJ7l9DQ0QqgHNDbdsIjp/9NcEvEbkMcF1Dw18+RnBsbT3ByYHdE8/+QHCSYIOZvdTP7r8GHif42d5C8HP43QhfwieBzaHP3k3A50JJr4gchgV/F4mIiIiIJBb16IqIiIhIQlKiKyIiIiIJSYmuiIiIiCQkJboiIiIikpCU6IqIiIhIQoqrgtN5eXlu2rRp0Q5DRERERGLE2rVrdzvn+q2/HleJ7rRp0ygrK4t2GCIiIiISIwarf66hCyIiIiKSkOKqR1dEREQklgQCAcrXlVPjr6HIV0TpvFI8Hk+0w5IQJboiIiIiRyEQCLDi/hU0ZDTgzfOyoWoDa9avYdnSZUp2Y4QSXREREZGjUL6unIaMBornFAOQ68ulprKG8nXlnLnozKM+7sGDB9m2bRutra3DFWpCSE9PZ+rUqaSmpka8jxJdERERkaNQ46/Bm+fts82T56F2Z+2Qjrtt2za8Xi/Tpk3DzIZ0rEThnGPPnj1s27aN6dOnR7yfJqOJiIiIHIUiXxFNu5v6bAvsDlA4qXBIx21tbWXixIlKcnsxMyZOnHjEvdxKdEVERESOQum8UnJbcqmurKbB30BNZQ05LTmUzisd8rGV5IY7mmuiRFdERETkKHg8HpYtXcaFMy+kqK2IC2ZeoIloA+i+Jjt27ODSSy8d9Lm33norzc3Nw3JejdEVEREROUoej2dIE8/iWWdnJ8nJyUe0z+TJk3nooYcGfc6tt97K0qVLGT9+/FDCA9SjKyIiIiKH2Lp1KyeccAJf/vKXmTt3LpdeeinNzc1MmzaNm2++mTPOOIO//OUvvPvuu1x44YXMnz+fM888k02bNgHw/vvvc9ppp7Fw4UJ++MMf9jnunDlzgGCifO2113LyySczd+5cbr/9dm677TZ27NjB2Wefzdlnnz3k16EeXREREREJ884773DPPfewaNEirrjiCu68804gWObr5ZdfBuDcc89l+fLlHHfccaxevZqrrrqK5557jquvvpqvf/3rfOlLX+KOO+7o9/i//e1vef/99ykvLyclJYWGhgZyc3P55S9/yapVq8jLyxvya1CiKyIiIhLDbrnllrBt8+fP56Mf/Sjt7e3cfvvtYe2nnXYap59+enBRixUr+rRdc801EZ23sLCQRYsWAbB06VJuu+02AD73uc8BwQUzXn31VS677LKefdra2gB45ZVXePjhhwH44he/yHXXXRd2/GeeeYavfe1rpKQE09Hc3NyI4joSSnRFREREJMyhVQ66H2dmZgLQ1dVFdnY2FRUVEe1/KOfciFeXUKIrIiIiEsMG64FNS0sbtN3j8UTcg3uompoaXnvtNU477TQefPBBzjjjDMrLy3vas7KymD59On/5y1+47LLLcM7x1ltvMW/ePBYtWsQf//hHli5dygMPPNDv8c8//3yWL1/ORz/60T5DF7xeL01NTcMydCFqk9HMrNDMVpnZRjN728yujlYsIiIiItLX7Nmz+f3vf8/cuXNpaGjg61//ethzHnjgAe655x7mzZvHSSedxKOPPgrAr371K+644w4WLlzIvn37+j3+V77yFYqKipg7dy7z5s3jD3/4AwBXXnklixcvHpbJaOacG/JBjurEZgVAgXPuTTPzAmuBTznnNgy0z4IFC1xZWdmoxSgiIiIy2jZu3Mjs2bOjGsPWrVtZsmQJlZWVUY3jUP1dGzNb65xb0N/zo9aj65yrc869Gfp7E7ARmBKteEREREQkscREHV0zmwaUAqujG4mIiIiITJs2LeZ6c49G1BNdM/MADwPfcs7t76f9SjMrM7Oy+vr60Q9QREREROJSVBNdM0slmOQ+4Jz7v/6e45z7rXNugXNuQX5+/ugGKCIiIiJxK5pVFwy4B9jonPtltOIQERERkcQUzR7dRcAXgXPMrCL08/EoxiMiIiIiCSSaVRdeds6Zc26uc64k9PNktOIREREREdi7dy933nnnEe/38Y9/nL17945AREcv6pPRRERERCR2DJTodnZ2Drrfk08+SXZ29kiFdVS0BLCIiIiI9Pje977Hu+++S0lJCampqXg8HgoKCqioqGDDhg186lOfora2ltbWVq6++mquvPJKIFiSrKysjEAgwOLFiznjjDN49dVXmTJlCo8++igZGRmj/lqU6IqIiIjEsUAgQPm6cmr8NRT5iiidV4rH4znq4/3sZz+jsrKSiooKnn/+eT7xiU9QWVnJ9OnTAbj33nvJzc2lpaWFhQsXcskllzBx4sQ+x9iyZQsPPvggd911F5/97Gd5+OGHWbp06ZBe59FQoisiIiISpwKBACvuX0FDRgPePC8bqjawZv0ali1dNqRkt7dTTjmlJ8kFuO2223jkkUcAqK2tZcuWLWGJ7vTp0ykpKQFg/vz5bN26dVhiOVIaoysiIiISp8rXldOQ0UDxnGJyfbkUzymmMaOR8nXlw3aOzMzMnr8///zzPPPMM7z22musW7eO0tJSWltbw/YZN25cz9+Tk5Pp6OgYtniOhBJd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5893r7zySp9tKSkppKSk4Jyjra0tbJ9I27u6umhvbw9rT01NJTk5ecD2tLQ0kpKSBmxvb29n3fp1bN2+lYK8AkrmlvS5Fda9f0dHBx0dHWH7jxs3DjM7bLuIiIjIWGRma51zC/pri6seXTMjPT39iNsiaU9KShr29kAgwF1/uKunAPmm2k2s27yu3wLk3Qn3QA7XLiIiIiJ9aar+CFIBchEREZHoUaI7glSAXERERCR6lOiOoCJfEU27m/psC+wOUDhJBchFRERERpoS3RGkAuQiIiIi0aPZTSNIBchFREREokeJ7ghTAXIRERGR6NDQBRERERFJSEp0RURERCQhKdEVERERkYSkRFdEREREEpISXRERERFJSFFJdM3sF2a2yczeMrNHzCw7GnGIiIiISOKKVo/u08Ac59xcYDNwfZTiEBEREZEEFZVE1zm30jnXEXr4OjA1p9m8oQAACE9JREFUGnGIiIiISOKKhTG6VwD/L9pBiIiIiEhiGbGV0czsGcDXT9MNzrlHQ8+5AegAHhjkOFcCVwIUFRWNQKSHFwgEKF9XTo2/hiJfkZbxFREREYkD5pyLzonNvgx8DTjXOdccyT4LFixwZWVlIxvYIQKBACvuX0FDRgPePC9Nu5vIbcll2dJlSnZFREREoszM1jrnFvTXFq2qCxcC1wEXR5rkRkv5unIaMhoonlNMri+X4jnFNGY0Ur6uPNqhiYiIiMggojVG99eAF3jazCrMbHmU4jisGn8N3jxvn22ePA+1O2ujFJGIiIiIRGLExugOxjk3MxrnPRpFviI2VG0g15fbsy2wO0DhzMIoRiUiIiIihxMLVRdiWum8UnJbcqmurKbB30BNZQ05LTmUziuNdmgiIiIiMoio9OjGE4/Hw7KlyyhfV07tzloKZxaq6oKIiIhIHFCiGwGPx8OZi86MdhgiIiIicgQ0dEFEREREEpISXRERERFJSEp0RURERCQhKdEVERERkYSkRFdEREREEpISXRERERFJSEp0RURERCQhKdEVERERkYSkRFdEREREEpISXRERERFJSEp0RURERCQhKdEVERERkYRkzrloxxAxM2sC3ol2HDLq8oDd0Q5CokLv/dik933s0ns/Ng31fS92zuX315AyhINGwzvOuQXRDkJGl5mV6X0fm/Tej01638cuvfdj00i+7xq6ICIiIiIJSYmu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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "depths = np.linspace(0,10.25,1000)                          # set the predictor values for our prediction\n",
    "spors = our_tree.predict(depths.reshape(-1, 1))             # predict with our trained model\n",
    "plt.scatter(X_train,y_train,color='green',s=30,edgecolor='black',alpha=0.4,label='train'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.title('Train and Test Data and Model Predictions'); plt.xlim([0,10.25]); plt.ylim([-2.5,2.5]); plt.scatter(X_test,y_test,color='gray',s=30,edgecolor='black',alpha=0.2,label='test'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right')\n",
    "plt.plot(depths,spors,color='black',alpha=0.6,label='predict',linestyle='--'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right'); plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Changing the Model Hyperparameter(s)\n",
    "\n",
    "Let's try changing the model complexity and refitting the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "max_leaf_nodes = 10                                         # set the hyperparameter\n",
    "our_tree = tree.DecisionTreeRegressor(max_leaf_nodes = max_leaf_nodes) # instantiate the model\n",
    "our_tree = our_tree.fit(X_train, y_train)                   # fit the model to the trainin data\n",
    "spors = our_tree.predict(depths.reshape(-1, 1))             # predict with our trained model\n",
    "plt.scatter(X_train,y_train,color='green',s=30,edgecolor='black',alpha=0.4,label='train'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.xlim([0,10.25]); plt.ylim([-2.5,2.5]); plt.scatter(X_test,y_test,color='gray',s=30,edgecolor='black',alpha=0.2,label='test'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right'); plt.plot(depths,spors,color='black',alpha=0.6,label='predict',linestyle='--'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right'); plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Tuning the Model Hyperparameter(s)\n",
    "\n",
    "To tune the model hyperparameters we need a metric to summarize model error over the withheld testing data\n",
    "\n",
    "* let's predict at the testing data and calculate our metric, testing mean square error. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing MSE is 0.5.\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics                                 # measures to check our models\n",
    "leaf_nodes = 2                                              # set the hyperparameter\n",
    "our_tree = tree.DecisionTreeRegressor(max_leaf_nodes = leaf_nodes) # instantiate the model\n",
    "our_tree = our_tree.fit(X_train, y_train)                   # fit the model to the trainin data\n",
    "y_predict = our_tree.predict(X_test)                        # predict at the testing data locations\n",
    "mse = metrics.mean_squared_error(y_test,y_predict)\n",
    "print('Testing MSE is ' + str(round(mse,2)) + '.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Tuning the Model Hyperparameter(s)\n",
    "\n",
    "To tune the model hyperparameters we need to rebuild the model with a variable level of complexity\n",
    "\n",
    "* let's loop over the number of leaf nodes and plot the performance over the withheld testing data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "nodes = []; scores = []; max_leaf_nodes = 30\n",
    "for i, nnode in enumerate(np.arange(2,max_leaf_nodes,1)):\n",
    "    our_tree = tree.DecisionTreeRegressor(max_leaf_nodes = nnode).fit(X_train, y_train) # instantiate / fit\n",
    "    y_predict = our_tree.predict(X_test)                    # predict at the testing data locations\n",
    "    nodes.append(nnode); scores.append(metrics.mean_squared_error(y_test,y_predict))\n",
    "plt.scatter(nodes,scores,color='red',s=30,edgecolor='black',alpha=0.4,label='train'); plt.plot(nodes,scores,color='red',alpha=0.2,linestyle='--'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.xlim([1,max_leaf_nodes]); plt.xlabel('Number of Leaf Nodes'); plt.ylabel('Testing Mean Square Error'); plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Tuning the Model Hyperparameter(s)\n",
    "\n",
    "To tune the model hyperparameters we need to rebuild the model with variable level of complexity\n",
    "\n",
    "* for a more robust assessment of performance let's use scikit-learns k-fold cross validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score as kfold       # cross validation methods\n",
    "nodes = []; scores = []; max_leaf_nodes = 30\n",
    "for i, nnode in enumerate(np.arange(2,max_leaf_nodes,1,dtype = int)):\n",
    "    our_tree = tree.DecisionTreeRegressor(max_leaf_nodes = nnode) # instantiate / fit\n",
    "    nodes.append(nnode); \n",
    "    scores.append(abs(kfold(estimator=our_tree,X=X,y=y,cv=4,n_jobs=4,scoring = \"neg_mean_squared_error\").mean()))\n",
    "plt.scatter(nodes,scores,color='red',s=30,edgecolor='black',alpha=0.4,label='train'); plt.plot(nodes,scores,color='red',alpha=0.2,linestyle='--'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.xlim([1,max_leaf_nodes]); plt.xlabel('Number of Leaf Nodes'); plt.ylabel('Testing Mean Square Error'); plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Select the Best Hyperparameter(s) and Re-train on All Data \n",
    "\n",
    "The main product from all of the previous work is the tuned hyperparameter, the optimum model complexity. \n",
    "\n",
    "* now we refit the tuned model, train the model on all the data and our tuned model is ready for real-world use\n",
    "\n",
    "* once again we are assuming a train and test workflow, not a train, validate and test workflow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "tuned_nodes = nodes[np.argmin(scores)]\n",
    "our_tuned_tree = tree.DecisionTreeRegressor(max_leaf_nodes = tuned_nodes).fit(X, y) # instantiate / fit\n",
    "tuned_spors = our_tuned_tree.predict(depths.reshape(-1, 1))             # predict with our trained model\n",
    "plt.scatter(X_train,y_train,color='green',s=30,edgecolor='black',alpha=0.4,label='train'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity'); plt.title('Train and Test Data and Tuned Model with ' + str(tuned_nodes) + ' Leaf Nodes'); plt.xlim([0,10.25]); plt.ylim([-2.5,2.5]); plt.scatter(X_test,y_test,color='gray',s=30,edgecolor='black',alpha=0.2,label='test'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right')\n",
    "plt.plot(depths,tuned_spors,color='black',alpha=0.6,label='tuned model',linestyle='--'); plt.xlabel('Depth (m)'); plt.ylabel('Standardized Porosity');plt.legend(loc='upper right'); plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=0.7, wspace=0.2, hspace=0.2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Same Complete Workflow with Pipelines\n",
    "\n",
    "Let's repeat the above workflow with a pipline from scikit-learn. Here some general comments:\n",
    "\n",
    "* **pipeline workflow steps** - list of steps, custom labels and the associated scikit-learn classes\n",
    "* **choices and hyperparameters** - as a dictionary with combined step custom labels and hyperparameter names\n",
    "* **workflow scenarios** - we can specify lists of choices and hyperparameters\n",
    "* **consistent iteration** - the entire workflow is repeated for the full combinatorial\n",
    "* **best model selected** - best combination of model hyperparameters and choices are refit with all data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tuned maximum number of leaf nodes = 14.\n",
      "Prediction at depth = 2.5 m is [-0.97]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import Pipeline                       # machine learning modeling pipeline\n",
    "pipe = Pipeline([                                           # the machine learning workflow as a pipeline object\n",
    "    ('tree', tree.DecisionTreeRegressor())\n",
    "])\n",
    "\n",
    "params = {                                                  # the machine learning workflow method's parameters\n",
    "    'tree__max_leaf_nodes': np.arange(2,max_leaf_nodes,1,dtype = int)\n",
    "}\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV            # model hyperparameter grid search\n",
    "grid_cv_tuned = GridSearchCV(pipe, params, scoring = 'neg_mean_squared_error', # grid search cross validation \n",
    "                             cv=4,refit = True);\n",
    "\n",
    "grid_cv_tuned.fit(X,y);                                      # fit model with tuned hyperparameters\n",
    "print('Tuned maximum number of leaf nodes = ' + str(grid_cv_tuned.best_params_['tree__max_leaf_nodes']) + '.')\n",
    "depth = 2.5\n",
    "print('Prediction at depth = ' + str(depth) + ' m is ' + str(np.round(grid_cv_tuned.predict([[depth]]),2))) # predict with our trained model) + '.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Comments\n",
    "\n",
    "This was a very simple demonstration of predictive machine learning model building with Python's scikit-learn.\n",
    "\n",
    "* this is a basic introduction, much more could be done\n",
    "\n",
    "I hope this was helpful,\n",
    "\n",
    "*Michael*\n",
    "\n",
    "Michael Pyrcz, Ph.D., P.Eng. Associate Professor The Hildebrand Department of Petroleum and Geosystems Engineering, Bureau of Economic Geology, The Jackson School of Geosciences, The University of Texas at Austin\n",
    "On twitter I'm the @GeostatsGuy.\n",
    "\n",
    "\n",
    "***\n",
    "\n",
    "#### More on Michael Pyrcz and the Texas Center for Geostatistics:\n",
    "\n",
    "### Michael Pyrcz, Associate Professor, University of Texas at Austin \n",
    "*Novel Data Analytics, Geostatistics and Machine Learning Subsurface Solutions*\n",
    "\n",
    "With over 17 years of experience in subsurface consulting, research and development, Michael has returned to academia driven by his passion for teaching and enthusiasm for enhancing engineers' and geoscientists' impact in subsurface resource development. \n",
    "\n",
    "For more about Michael check out these links:\n",
    "\n",
    "#### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n",
    "\n",
    "#### Want to Work Together?\n",
    "\n",
    "I hope this content is helpful to those that want to learn more about subsurface modeling, data analytics and machine learning. Students and working professionals are welcome to participate.\n",
    "\n",
    "* Want to invite me to visit your company for training, mentoring, project review, workflow design and / or consulting? I'd be happy to drop by and work with you! \n",
    "\n",
    "* Interested in partnering, supporting my graduate student research or my Subsurface Data Analytics and Machine Learning consortium (co-PIs including Profs. Foster, Torres-Verdin and van Oort)? My research combines data analytics, stochastic modeling and machine learning theory with practice to develop novel methods and workflows to add value. We are solving challenging subsurface problems!\n",
    "\n",
    "* I can be reached at mpyrcz@austin.utexas.edu.\n",
    "\n",
    "I'm always happy to discuss,\n",
    "\n",
    "*Michael*\n",
    "\n",
    "Michael Pyrcz, Ph.D., P.Eng. Associate Professor The Hildebrand Department of Petroleum and Geosystems Engineering, Bureau of Economic Geology, The Jackson School of Geosciences, The University of Texas at Austin\n",
    "\n",
    "#### More Resources Available at: [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
